/*
* Copyright (C) 2015, Jhuster, All Rights Reserved
*
* Author: Jhuster(lujun.hust@gmail.com)
*
* https://github.com/Jhuster/JNote
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; version 2 of the License.
*/
package com.jhuster.jnote.markdown;
import java.util.List;
import com.jhuster.jnote.markdown.Markdown.MDLine;
import com.jhuster.jnote.markdown.Markdown.MDWord;
import android.graphics.Color;
import android.text.Layout;
import android.text.SpannableStringBuilder;
import android.text.Spanned;
import android.text.style.AlignmentSpan;
import android.text.style.BulletSpan;
import android.text.style.LeadingMarginSpan;
import android.text.style.QuoteSpan;
import android.text.style.RelativeSizeSpan;
import android.text.style.StyleSpan;
import android.text.style.TypefaceSpan;
public class MDFormatter {
private final SpannableStringBuilder mBuilder = new SpannableStringBuilder();
public MDFormatter(List<MDLine> lines) {
for (MDLine line : lines) {
format(line);
}
mBuilder.setSpan(new TypefaceSpan("monospace"), 0, mBuilder.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
}
public SpannableStringBuilder getFormattedContent() {
return mBuilder;
}
protected void format(MDLine line) {
int start = mBuilder.length();
for (MDWord word : line.mMDWords) {
int index = mBuilder.length();
mBuilder.append(word.mRawContent);
mBuilder.setSpan(getSpan(word.mFormat), index, mBuilder.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
}
mBuilder.append("\n");
if (line.mFormat == Markdown.MD_FMT_ORDER_LIST ||
line.mFormat == Markdown.MD_FMT_UNORDER_LIST ||
line.mFormat == Markdown.MD_FMT_QUOTE) {
mBuilder.setSpan(new LeadingMarginSpan.Standard(40), start, mBuilder.length(), Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
}
if (line.mFormat != Markdown.MD_FMT_TEXT) {
mBuilder.setSpan(getSpan(line.mFormat), start, mBuilder.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
}
}
protected static Object getSpan(int format) {
switch (format) {
case Markdown.MD_FMT_TEXT:
return new RelativeSizeSpan(1.1f);
case Markdown.MD_FMT_HEADER1:
return new RelativeSizeSpan(1.5f);
case Markdown.MD_FMT_HEADER2:
return new RelativeSizeSpan(1.4f);
case Markdown.MD_FMT_HEADER3:
return new RelativeSizeSpan(1.3f);
case Markdown.MD_FMT_QUOTE:
return new QuoteSpan(Color.GRAY);
case Markdown.MD_FMT_ITALIC:
return new StyleSpan(android.graphics.Typeface.ITALIC);
case Markdown.MD_FMT_BOLD:
return new StyleSpan(android.graphics.Typeface.BOLD);
case Markdown.MD_FMT_CENTER:
return new AlignmentSpan.Standard(Layout.Alignment.ALIGN_CENTER);
case Markdown.MD_FMT_UNORDER_LIST:
return new BulletSpan(10, Color.BLACK);
case Markdown.MD_FMT_ORDER_LIST:
return new BulletSpan(10, Color.TRANSPARENT);
default:
break;
}
return null;
}
}